<?php
declare (strict_types=1);

namespace app\utils\http;

use think\Exception;

class HttpClient extends \GuzzleHttp\Client
{
    /**
     * 创建一个HTTP类实例
     * @param array $args 实例化参数
     * @return static
     */
    public static function createInstance(array $args = [])
    {
        // 实例的类名
        $class = static::class;
        // 实例化类
        $instance = new $class(...$args);
        // 实例初始化操作
        $instance->initialization();
        // 返回类实例的对象
        return $instance;
    }
    
    private function initialization()
    {
    }
    
    /**
     * 发送请求
     *
     * @Interface pokeRequest
     *
     * @param string $method 请求方式 默认 GET
     * @param string $url 请求地址
     * @param array  $options 参数
     *
     * @return object|string
     * @throws \GuzzleHttp\Exception\GuzzleException
     * @throws \think\Exception
     * @Author    StarsPhp
     * @Date      2022/8/17
     * @Time      16:22
     */
    public function pokeRequest(string $method = 'GET', string $url = '', array $options = [])
    {
        $response = $this->request($method, $url, array_merge($options, ['http_errors' => false]));
        // dump($response);
        // dump($response->getStatusCode());
        // 请求 异常
        // if ($response->getStatusCode() != 200) {
        //     throw new Exception(json_encode([
        //         'StatusCode' => $response->getStatusCode(),
        //         'body' => $response->getBody()->getContents()
        //     ]));
        // }
        
        // dump($response->getBody());
        $data = $response->getBody()->getContents();
        // dump($data);
        // dump($response->getHeader('content-type'));
        $contentType = implode(',',$response->getHeader('content-type'));
        // dump($contentType);
        
        // 如果是 json 数据进行数据转换
        if (stripos($contentType, 'json') !== false) {
            return json_decode($data);
        }
        
        return $data;
    }
    
    /**
     * 发起 GET 请求
     *
     * @param string $url    请求的URL
     * @param array  $data   请求参数
     * @param array  $header 请求头
     * @param array  $options
     *
     * @return object
     * @throws \think\Exception|\GuzzleHttp\Exception\GuzzleException
     */
    public function getRequest(string $url, array $data =[], array $header = [], array $options = [])
    {
        return $this->pokeRequest('GET', $url, array_merge(['query' => $data, 'headers' => $header], $options));
    }
    
    /**
     * 发起 POST 请求
     *
     * @param string $url    请求的URL
     * @param array  $data   请求参数
     * @param array  $header 请求头
     * @param array  $options
     *
     * @return object
     * @throws \think\Exception|\GuzzleHttp\Exception\GuzzleException
     */
    public function postJsonRequest(string $url, array $data =[], array $header = [], array $options = [])
    {
        return $this->pokeRequest('POST', $url, array_merge(['json' => $data, 'headers' => $header], $options));
    }
    
    /**
     * 发起 POST 请求
     *
     * @param string $url    请求的URL
     * @param array  $data   请求参数
     * @param array  $header 请求头
     * @param array  $options
     *
     * @return object
     * @throws \think\Exception|\GuzzleHttp\Exception\GuzzleException
     */
    public function postRequest(string $url, array $data =[], array $header = [], array $options = [])
    {
        return $this->pokeRequest('POST', $url, array_merge(['form_params' => $data, 'headers' => $header], $options));
    }
}